package com.pet.system.controller;

import com.pet.common.constant.ResponseCode;
import com.pet.common.model.PageModel;
import com.pet.common.model.ResponseResult;
import com.pet.system.domain.entity.SysUser;
import com.pet.system.domain.model.LoginUser;
import com.pet.system.domain.vo.SysUserVO;
import com.pet.system.security.shiro.SecurityUtils;
import com.pet.system.service.IPermissionService;
import com.pet.system.service.ISysUserService;
import com.pet.system.utils.StringUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户控制器 映射地址："/user" 请求接收说明如下 <br>
 * Get：查询所有用户信息，使用分页包装返回，需要管理权限："sys:user:list" <br>
 * Get("/info")：查询当前登录用户信息，返回用户、权限、角色，无权限要求 <br>
 * Get("/{ids}")：查询当前登录用户信息，返回用户、权限、角色，无权限要求 <br>
 * Post：录入新的登录用户(可获取管理权限)，返回执行情况，需要管理权限："sys:user:save" <br>
 * Post("/register")：录入新的登录用户(注册用户，默认基础权限)，返回执行情况，无权限要求 <br>
 * Put：更新用户信息(可修改管理员权限)，返回执行情况，需要管理权限："sys:user:update" <br>
 * Put("/updateInfo")：更新个人用户信息(普通用户修改密码等信息)，无权限需求 <br>
 * Delete("/{ids}")：管理员批量删除用户，返回执行情况，需要管理权限："sys:user:delete" <br>
 *
 * @author Centaurea
 */
@Api(tags = "用户管理")
@RestController
@RequestMapping("user")
@AllArgsConstructor
public class UserController {
  /** 注入权限Service */
  private final IPermissionService permissionService;
  /** 注入用户Service */
  private final ISysUserService userService;

  /**
   * 管理员分页查询所有用户信息
   *
   * @param pageNo 页码
   * @param pageSize 分页容量
   * @param searchWord 检索关键词
   * @param status 检索用户状态
   * @return 统一响应模型返回前端
   */
  @ApiOperation("管理员查询所有用户信息，需要管理权限：\"sys:user:list\"")
  @RequiresPermissions("sys:user:list")
  @GetMapping
  public ResponseResult query(Integer pageNo, Integer pageSize, String searchWord, String status) {
    Map<String, Object> params = new HashMap<>(2);
    params.put("searchWord", searchWord);
    params.put("status", status);
    PageModel<SysUser> query = userService.query(new PageModel<>(pageNo, pageSize), params);
    return ResponseResult.success(ResponseCode.WEB_200, query);
  }

  /**
   * 获取登录者自身信息
   *
   * @return 统一响应模型返回前端
   */
  @ApiOperation("获取登录者自身信息，无需权限")
  @GetMapping("info")
  public ResponseResult info() {
    LoginUser loginUser = SecurityUtils.getLoginUser();
    if (loginUser == null) {
      throw new SecurityException("非法请求");
    }
    SysUser user = userService.getByUserName(loginUser.getUsername());
    Map<String, Object> data = new HashMap<>(3);
    data.put("user", user);
    data.put("perms", permissionService.getPermissions(user.getId()));
    data.put("roles", permissionService.getRoles(user.getId()));
    return ResponseResult.success(ResponseCode.WEB_200, data);
  }

  /**
   * 录入新的登录用户，可以设置管理员权限
   *
   * @param userDto 管理员角色模板
   * @return 统一响应模型返回前端
   */
  @ApiOperation("录入新的登录用户(可为管理员)，需要管理权限：\"sys:user:save\"")
  @PostMapping
  @RequiresPermissions("sys:user:save")
  public ResponseResult save(SysUserVO userDto) {
    try {
      SysUser save = userService.save(userDto);
      return ResponseResult.success(ResponseCode.WEB_200, save);
    } catch (DuplicateKeyException e) {
      return ResponseResult.error(userDto.getUsername() + "已存在，不可重复添加");
    }
  }

  /**
   * 注册新的登录用户，不可设置管理员权限
   *
   * @param userDto 普通角色模板
   * @return 统一响应模型返回前端
   */
  @ApiOperation("注册新的登录用户(可为管理员)，无需权限")
  @PostMapping("register")
  public ResponseResult register(SysUserVO userDto) {
    try {
      SysUser save = userService.save(userDto);
      return ResponseResult.success(ResponseCode.WEB_200, save);
    } catch (DuplicateKeyException e) {
      return ResponseResult.error(userDto.getUsername() + "已存在，不可重复添加");
    }
  }

  /**
   * xzx
   *
   * @param id
   * @param status
   * @return 统一响应模型返回前端
   */
  @ApiOperation("修改用户状态")
  @PutMapping("updateStatus")
  //  @RequiresPermissions("sys:user:update")
  public ResponseResult updateStatus(Integer id, int status) {

    boolean flag = userService.updateStatus(id, status);
    return flag ? ResponseResult.success(ResponseCode.WEB_200) : ResponseResult.error();
  }

  /**
   * xx
   *
   * @param userDto
   * @return 统一响应模型返回前端
   */
  @ApiOperation("更新用户信息(可修改管理员权限)，返回执行情况，需要管理权限：\"sys:user:update\"")
  @PutMapping
  @RequiresPermissions("sys:user:update")
  public ResponseResult update(SysUserVO userDto) {

    userService.update(userDto);
    return ResponseResult.success(ResponseCode.WEB_200);
  }

  /**
   * xx
   *
   * @param userDto
   * @return 统一响应模型返回前端
   */
  @ApiOperation("更新用户普通信息，无需权限")
  @PutMapping("updateInfo")
  public ResponseResult updateInfo(SysUserVO userDto) {
    System.out.println(userDto);
    return ResponseResult.success(ResponseCode.WEB_200);
  }

  @ApiOperation("删除用户")
  @DeleteMapping("{ids}")
  @RequiresPermissions("sys:user:delete")
  public ResponseResult delete(@PathVariable String ids) {
    List<Integer> longList = StringUtil.parseInteger(ids);
    LoginUser loginUser = SecurityUtils.getLoginUser();
    if (longList.contains(loginUser.getId())) {
      return ResponseResult.error("不可删除自己！");
    }
    userService.batchDelete(longList);
    return ResponseResult.success(ResponseCode.WEB_200);
  }
}
